#ifndef LISTA_H
#define LISTA_H

#include <stdbool.h>
#include <stddef.h>

/****************************************************************
 *               DEFINICIÓN DE TIPOS DE DATOS                   *
 ***************************************************************/ 

typedef struct lista lista_t;
typedef struct iter lista_iter_t;

/****************************************************************
 *                      PRIMITIVAS BÁSICAS                      *
 ***************************************************************/                      
/*DOCUMENTAR*/
lista_t *lista_crear();

/*DOCUMENTAR*/
bool lista_esta_vacia(const lista_t *lista);

/*DOCUMENTAR*/
bool lista_insertar_primero(lista_t *lista, void *dato);

/*DOCUMENTAR*/
bool lista_insertar_ultimo(lista_t *lista, void *dato);

/*DOCUMENTAR*/
void *lista_borrar_primero(lista_t *lista);

/*DOCUMENTAR*/
void *lista_ver_primero(const lista_t *lista);

/*DOCUMENTAR*/
size_t lista_largo(const lista_t *lista);

/*DOCUMENTAR*/
void lista_destruir(lista_t *lista, void destruir_dato(void *));

/****************************************************************
 *                    PRIMITIVAS DE ITERACIÓN                   *
 ***************************************************************/                      

/*DOCUMENTAR*/
lista_iter_t *lista_iter_crear(const lista_t *lista);

/*DOCUMENTAR*/
bool lista_iter_avanzar(lista_iter_t *iter);

/*DOCUMENTAR*/
void *lista_iter_ver_actual(const lista_iter_t *iter);

/*DOCUMENTAR*/
bool lista_iter_al_final(const lista_iter_t *iter);

/*DOCUMENTAR*/
void lista_iter_destruir(lista_iter_t *iter);



/****************************************************************
 *                 PRIMITIVAS DE LISTAS CON ITERADOR            *
 ***************************************************************/                      

/*DOCUMENTAR*/
bool lista_insertar(lista_t *lista, lista_iter_t *iter, void *dato);
/*DOCUMENTAR*/
void *lista_borrar(lista_t *lista, lista_iter_t *iter);

#endif //LISTA_H
